home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / configfile.r < prev    next >
Text File  |  1995-04-01  |  9KB  |  568 lines

  1.  
  2. ;---;  configfile.r  ;---------------------------------------------------------
  3. *
  4. *    ****    CONFIGURATION FILE MANAGEMENT    ***
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        1.01
  8. *    Last Revision    19.03.94
  9. *    Identifier    rwc_defined
  10. *       Prefix        rwc_    (Read and Write Configuration)
  11. *                 ¯        ¯     ¯
  12. *    Functions    ReadConfigFile, WriteConfigFile
  13. *
  14. *    Requirements    dosfile.r, numbers.mac, stringmacros.r
  15. *
  16. ;------------------------------------------------------------------------------
  17.  
  18.     IFND    rwc_defined
  19. rwc_defined    SET    1
  20.  
  21. ;------------------
  22. rwc_oldbase    EQU __BASE
  23.     base    rwc_base
  24. rwc_base:
  25.  
  26. ;------------------
  27.     include    numbers.r
  28.     include    configfile.i
  29.  
  30.  
  31. ;------------------
  32.  
  33. ;------------------------------------------------------------------------------
  34. *
  35. * ReadConfigFile    Read a configuration file.
  36. *
  37. * INPUT:    a0:    File name.
  38. *        a1:    Configuration structure.
  39. *
  40. * RESULT:    d0:    -1 if successful, 0 if error.
  41. *        d1:    if d0=0: Line number or 0 if file not found.
  42. *
  43. ;------------------------------------------------------------------------------
  44.     IFD    xxx_ReadConfigFile
  45. ReadConfigFile:
  46.     movem.l    d2-a6,-(sp)
  47.     lea    rwc_base(pc),a4
  48.     move.l    a1,a5
  49.     clr.l    \linenum(a4)
  50.     moveq    #0,d6
  51.     moveq    #0,d7
  52.  
  53. \load:    move.l    a0,d0
  54.     moveq    #0,d1
  55.     moveq    #1,d2
  56.     CALL_    LoadFile
  57.     move.l    d0,\text
  58.     move.l    d0,\block
  59.     beq    \done
  60.     move.l    d2,\textlen
  61.     move.l    d0,a0
  62.     tst.b    (a0)            :file starts with 0? -> error
  63.     beq    \free
  64.     clr.b    -1(a0,d2)
  65.     addq.l    #1,\linenum(a4)
  66.  
  67. \loop:    move.l    \text(pc),a0
  68.     lea    \buffer(pc),a1
  69.     move.l    \linenum(a4),d7
  70.     move.l    d7,d1
  71.     CALL_    CopyLine
  72.     move.l    a0,\text(a4)
  73.     clr.b    -(a1)            ;remove CR
  74.     move.l    d1,\linenum(a4)
  75.     tst.w    d0
  76.     beq    \fine
  77.     
  78. \search:
  79.     move.l    a5,a2
  80.     lea    \buffer(pc),a3
  81. \slsk:    cmp.b    #" ",(a3)+
  82.     beq.s    \slsk
  83.     subq.l    #1,a3
  84.     tst.b    (a3)
  85.     beq.s    \loop
  86.  
  87. \sloop:    move.l    a3,a0
  88.     tst.b    (a2)
  89.     beq    \free            ;not found
  90.     cmp.b    #rwc_BITS0,(a2)
  91.     bhs.s    \od
  92.     cmp.b    #rwc_FLAGOFF,(a2)
  93.     bhi.s    \slnext
  94. \od:    move.w    rwc_offset1(a2),d0
  95.     lea    (a4,d0),a1
  96.     bsr    \compare
  97.     bne.s    \found
  98. \slnext:
  99.     lea    rwc_SIZEOF(a2),a2
  100.     bra.s    \sloop
  101.     
  102. \found:    move.l    a2,a3
  103.     move.l    a0,d4
  104.     move.w    rwc_readcall(a3),d0
  105.     beq.s    \norc
  106.     jsr    (a4,d0)
  107.     tst.w    d0
  108.     beq    \free
  109. \norc:    move.w    rwc_offset2(a3),d1
  110.     cmp.b    #rwc_FLAGON,(a3)
  111.     beq    \flagon
  112.     cmp.b    #rwc_FLAGOFF,(a3)
  113.     beq    \flagoff
  114.     cmp.b    #rwc_BITC0,(a3)
  115.     bhs    \rbitc
  116.     cmp.b    #rwc_BITS0,(a3)
  117.     bhs    \rbits
  118.  
  119. \doall:    lea    rwc_SIZEOF(a3),a3
  120.     cmp.b    #rwc_ENDLOOP,(a3)
  121.     beq.s    \last    
  122.     bls.s    \alldone
  123.     cmp.b    #rwc_IF,(a3)
  124.     beq.s    \alldone
  125.     move.l    d4,a0
  126.     CALL_    RemoveSpaces
  127.  
  128.     moveq    #0,d0
  129.     move.b    (a3),d0
  130.     add.w    d0,d0
  131.     lea    \jumps(pc),a1
  132.     move.w    -2*rwc_DECBYTE(a1,d0),d1
  133.     move.w    rwc_offset1(a3),d2
  134.     lea    (a4,d2),a1
  135.     move.w    rwc_offset2(a3),d2
  136.     lea    (a4,d2),a2
  137.     jsr    (a4,d1)
  138.  
  139.     move.l    a0,d4
  140.     tst.w    d0
  141.     beq.s    \free
  142.     move.w    rwc_readcall(a3),d0
  143.     beq.s    \norc2
  144.     jsr    (a4,d0)
  145.     tst.w    d0
  146.     beq.s    \free
  147. \norc2:    bra.s    \doall
  148.  
  149. \last    move.w    rwc_readcall(a3),d0
  150.     beq.s    \norc3
  151.     jsr    (a4,d0)
  152.     tst.w    d0
  153.     beq.s    \free
  154. \norc3:    bra.s    \doall
  155.  
  156. \alldone:
  157.     bra    \loop
  158.  
  159. \fine:    moveq    #-1,d6
  160.  
  161. \free:    move.l    4.w,a6
  162.     move.l    \block(pc),a1
  163.     move.l    \textlen(pc),d0
  164.     jsr    -210(a6)        ;FreeMem
  165.     
  166. \done:    move.l    d7,d1
  167.     move.l    d6,d0
  168.     movem.l    (sp)+,d2-a6
  169.     rts
  170.  
  171. \flagon:
  172.     st.b    (a4,d1)
  173. \flagdone:
  174.     bra    \loop
  175. \flagoff:
  176.     sf.b    (a4,d1)
  177.     bra.s    \flagdone
  178.  
  179. \rbits:    move.b    (a3),d0
  180.     sub.b    #rwc_BITS0,d0
  181.     bset    d0,(a4,d1)
  182.     bra.s    \flagdone
  183.  
  184. \rbitc:    move.b    (a3),d0
  185.     sub.b    #rwc_BITC0,d0
  186.     bclr    d0,(a4,d1)
  187.     bra.s    \flagdone
  188.  
  189.  
  190. \jumps:    dc.w    \rnumber%
  191.     dc.w    \rnumber%
  192.     dc.w    \rnumber%
  193.     dc.w    \rnumber%
  194.     dc.w    \rnumber%
  195.     dc.w    \rnumber%
  196.     dc.w    \rkeywords%
  197.     dc.w    \rstrptr%
  198.     dc.w    \rstring%
  199.  
  200. ;------------------
  201. \compare:            ;a0: pointer in text, a1: pointer on KW
  202.     movem.l    d1/d2,-(sp)    ;d0:1= exact match, 0: not matched 
  203. \cmploop:
  204.     move.b    (a1)+,d0
  205.     bsr.s    \makeupper
  206.     move.b    d0,d1
  207.     move.b    (a0)+,d0
  208.     bsr.s    \makeupper
  209.     cmp.b    d0,d1
  210.     bne.s    \cmpdone
  211.     tst.b    d0
  212.     bne.s    \cmploop
  213.  
  214. \cmpdone:
  215.     subq.l    #1,a0
  216.     subq.l    #1,a1
  217.     cmp.b    #" ",(a0)
  218.     beq.s    \cmpok1
  219.     tst.b    (a0)
  220.     bne.s    \cmpbad
  221. \cmpok1:tst.b    (a1)
  222.     bne.s    \cmpbad
  223.     moveq    #1,d0
  224.     bra.s    \cmprts
  225. \cmpbad:moveq    #0,d0
  226. \cmprts:movem.l    (sp)+,d1/d2
  227.     rts
  228.  
  229. \makeupper:
  230.     cmp.b    #"a",d0
  231.     blt.s    \isupper
  232.     cmp.b    #"z",d0
  233.     bgt.s    \isupper
  234.     sub.b    #32,d0
  235. \isupper:
  236.     rts
  237.  
  238. ;------------------
  239. \rnumber:    
  240.     cmp.b    #"$",(a0)
  241.     beq.s    \rhex
  242. \rdec:    GetDecNumber_
  243.     beq    \rerr
  244.     bra    \rstore
  245. \rhex:    GetHexNumber_
  246.     beq    \rerr
  247. \rstore:moveq    #0,d1
  248.     move.b    (a3),d1
  249.     subq.b    #rwc_DECBYTE,d1
  250.     divu    #3,d1
  251.     swap    d1
  252.     subq.b    #1,d1    
  253.     bmi.s    \rbyte
  254.     beq.s    \rword
  255. \rlong:    move.l    d0,(a1)
  256.     bra.s    \rokay
  257. \rword:    move.w    d0,(a1)
  258.     bra.s    \rokay
  259. \rbyte:    move.b    d0,(a1)
  260. \rokay:    moveq    #-1,d0
  261.     rts
  262. \rerr:    moveq    #0,d0
  263.     rts
  264.  
  265. \rkeywords:
  266.     move.l    a1,d3
  267.     move.l    a0,d2
  268. \rkeyl:    move.w    2(a2),d0
  269.     beq.s    \rerr        ;key not found!
  270.     lea    (a4,d0),a1
  271.     move.l    d2,a0
  272.     bsr    \compare
  273.     bne.s    \rkf
  274.     addq.l    #4,a2
  275.     bra.s    \rkeyl
  276. \rkf:    move.l    d3,a1
  277.     move.w    (a2),(a1)
  278.     bra.s    \rokay
  279.  
  280. \rstrptr:
  281.     move.l    (a1),a1
  282. \rstring:
  283.     move.w    rwc_offset2(a3),d0
  284.     CALL_    ParseName
  285.     tst.w    d0
  286.     beq.s    \rokay
  287.     bra.s    \rerr
  288.  
  289. \buffer:    ds.b    256,0
  290. \linenum:    dc.l    0
  291. \text:        dc.l    0
  292. \block:        dc.l    0
  293. \textlen:    dc.l    0
  294.  
  295.     ENDIF
  296.  
  297.  
  298.  
  299. ;------------------------------------------------------------------------------
  300. *
  301. * WriteConfigFile    Write a configuration file.
  302. *
  303. * INPUT:    a0:    File name.
  304. *        a1:    Configuration structure.
  305. *
  306. * RESULT:    d0:    -1 if write successful, 0 if error.
  307. *
  308. ;------------------------------------------------------------------------------
  309.     IFD    xxx_WriteConfigFile
  310. WriteConfigFile:
  311.     movem.l    d1-a6,-(sp)
  312.     lea    rwc_base(pc),a4
  313.     moveq    #-1,d6
  314.     move.l    a1,a5
  315.  
  316.     move.l    a0,d1
  317.     move.l    #1006,d2
  318.     move.l    DosBase(pc),a6
  319.     jsr    -30(a6)            ;Open()
  320.     tst.l    d0
  321.     beq    \done2
  322.     lea    cio_conout(pc),a0
  323.     move.l    (a0),d7
  324.     move.l    d0,(a0)
  325.  
  326. \loop:    moveq    #0,d5
  327.     move.b    (a5),d5
  328.     move.w    rwc_writecall(a5),d0
  329.     beq.s    \nwc
  330.     jsr    (a4,d0)
  331. \nwc:    add.w    d5,d5
  332.     lea    \wjumps(pc),a0
  333.     move.w    (a0,d5),d5
  334.     move.w    rwc_offset1(a5),d0
  335.     lea    (a4,d0),a0
  336.     move.w    rwc_offset2(a5),d0
  337.     lea    (a4,d0),a1
  338.     jsr    (a4,d5)
  339.     tst.b    (a5)
  340.     beq.s    \end
  341.     lea    rwc_SIZEOF(a5),a5
  342.     tst.w    d6
  343.     bne.s    \loop
  344.  
  345. \end:    lea    cio_conout(pc),a0
  346.     move.l    (a0),d1
  347.     move.l    d7,(a0)
  348.     move.l    DosBase(pc),a6
  349.     jsr    -36(a6)            ;Close
  350.  
  351. \done:    move.l    d6,d0
  352. \done2:    movem.l    (sp)+,d1-a6
  353.     rts
  354.  
  355. \wjumps:
  356.     dc.w    \wnop%
  357.     dc.w    \wkey%
  358.     dc.w    \wdolist%
  359.     dc.w    \wdoloop%
  360.     dc.w    \wflagon%
  361.     dc.w    \wflagoff%
  362.     dc.w    \wendloop%
  363.     dc.w    \wifset%
  364.     dc.w    \wdecbyte%
  365.     dc.w    \wdecword%
  366.     dc.w    \wdeclong%
  367.     dc.w    \whexbyte%
  368.     dc.w    \whexword%
  369.     dc.w    \whexlong%
  370.     dc.w    \wkeywords%
  371.     dc.w    \wstrptr%
  372.     dc.w    \wstring%
  373.     dc.w    \wbits%
  374.     dc.w    \wbits%
  375.     dc.w    \wbits%
  376.     dc.w    \wbits%
  377.     dc.w    \wbits%
  378.     dc.w    \wbits%
  379.     dc.w    \wbits%
  380.     dc.w    \wbits%
  381.     dc.w    \wbitc%
  382.     dc.w    \wbitc%
  383.     dc.w    \wbitc%
  384.     dc.w    \wbitc%
  385.     dc.w    \wbitc%
  386.     dc.w    \wbitc%
  387.     dc.w    \wbitc%
  388.     dc.w    \wbitc%
  389.  
  390.  
  391. ;--------------------------------------
  392.  
  393. \wbits:    move.b    (a5),d0
  394.     sub.b    #rwc_BITS0,d0
  395.     btst    d0,(a1)
  396.     bne    \wkey
  397.     rts
  398.     
  399. \wbitc:    move.b    (a5),d0
  400.     sub.b    #rwc_BITC0,d0
  401.     btst    d0,(a1)
  402.     beq    \wkey
  403.     rts
  404.  
  405. \wifset:
  406.     move.l    a5,\lpos(a4)
  407.     tst.b    (a0)
  408.     beq    \wsend
  409.     rts
  410.     
  411. \wstring:
  412.     move.l    a0,\buffer(a4)
  413.     bra.s    \wanystr
  414. \wstrptr:
  415.     move.l    (a0),\buffer(a4)
  416. \wanystr:    lea    \wstrstring(pc),a0
  417.     bra    \wnum
  418.  
  419. \wkey:    CALL_    ConPrint
  420.  
  421. \all:    move.b    cio_error(pc),d0
  422.     beq.s    \nowe
  423.     moveq    #0,d6
  424.     rts
  425. \nowe:    cmp.b    #rwc_IF,rwc_SIZEOF(a5)        ;new keyword or end?
  426.     lea    \cr(pc),a0
  427.     bls.s    \write
  428.     cmp.b    #rwc_BITS0,rwc_SIZEOF(a5)
  429.     bhs.s    \write
  430.     lea    \space(pc),a0
  431. \write:    CALL_    ConPrint
  432.     move.b    cio_error(pc),d0
  433.     beq.s    \nowe2
  434.     moveq    #0,d6
  435. \nowe2:    rts
  436.  
  437. \wflagon:
  438.     tst.b    (a1)
  439.     bne.s    \wkey
  440. \wnop:    rts
  441.  
  442. \wflagoff:
  443.     tst.b    (a1)
  444.     beq.s    \wkey
  445.     rts
  446.  
  447. \wdecbyte:
  448.     move.b    (a0),\buffer+1(a4)
  449.     clr.b    \buffer(a4)
  450.     lea    \dwstring(pc),a0
  451.     bra.s    \wnum
  452.  
  453. \wdecword:
  454.     move.w    (a0),\buffer(a4)
  455.     lea    \dwstring(pc),a0
  456.     bra.s    \wnum
  457.  
  458. \wdeclong:
  459.     move.l    (a0),\buffer(a4)
  460.     lea    \dlstring(pc),a0
  461.     bra.s    \wnum
  462.  
  463. \whexbyte:
  464.     move.b    (a0),\buffer+1(a4)
  465.     clr.b    \buffer(a4)
  466.     lea    \hbstring(pc),a0
  467.     bra.s    \wnum
  468.  
  469. \whexword:
  470.     move.w    (a0),\buffer(a4)
  471.     lea    \hwstring(pc),a0
  472.     bra.s    \wnum
  473.  
  474. \whexlong:
  475.     move.l    (a0),\buffer(a4)
  476.     lea    \hlstring(pc),a0
  477.  
  478. \wnum:    lea    \buffer(pc),a1
  479.     CALL_    ConPrintRaw
  480.     bra    \all
  481.  
  482. \wdoloop:
  483.     move.w    (a1),\lcounter(a4)
  484.     beq.s    \wsend
  485.     move.l    a5,\lpos(a4)
  486.     bra    \wkey
  487.  
  488. \wdolist:
  489.     move.l    a5,\lpos(a4)
  490.     move.l    a1,\llist(a4)
  491.  
  492. \wlist:    move.l    \lpos(a4),a5
  493.     move.l    \llist(pc),a1
  494.     move.l    (a1),a1
  495.     move.l    a1,\llist(a4)
  496.     tst.l    (a1)
  497.     bne    \wkey
  498. \wsend:    cmp.b    #rwc_ENDLOOP,(a5)
  499.     beq.s    \wgend
  500.     lea    rwc_SIZEOF(a5),a5
  501.     bra.s    \wsend
  502. \wgend:    rts
  503.     
  504. \wendloop:
  505.     move.l    \lpos(pc),a1
  506.     move.w    rwc_offset1(a1),d0
  507.     lea    (a4,d0),a0
  508.     cmp.b    #rwc_IF,(a1)
  509.     beq.s    \wgend
  510.     cmp.b    #rwc_DOLOOP,(a1)
  511.     bne.s    \wlist
  512.     subq.w    #1,\lcounter(a4)
  513.     beq.s    \wgend
  514.     move.l    a1,a5
  515.     bra    \wkey
  516.     
  517. \wkeywords:
  518.     move.w    (a0),d0
  519. \wkloop:move.w    2(a1),d1
  520.     beq.s    \wnokey
  521.     lea    (a4,d1),a0
  522.     cmp.w    (a1),d0
  523.     beq    \wkey
  524.     addq.w    #4,a1
  525.     bra.s    \wkloop
  526. \wnokey:    rts
  527.  
  528.  
  529. \lpos:        dc.l    0
  530. \lcounter:    dc.w    0
  531. \llist:        dc.l    0
  532. \buffer:    dc.l    0
  533.  
  534. \cr:        dc.b    $a,0
  535. \space:        dc.b    $20,0
  536. \dwstring:    dc.b    "%d",0    
  537. \dlstring:    dc.b    "%ld",0    
  538. \hbstring:    dc.b    "$%02x",0    
  539. \hwstring:    dc.b    "$%04x",0    
  540. \hlstring:    dc.b    "$%08lx",0    
  541. \wstrstring:    dc.b    '"%s"',0
  542.     even
  543.  
  544.     ENDC
  545.  
  546.  
  547.  
  548. ;--------------------------------------------------------------------
  549.  
  550. ;------------------
  551.     include    conio.r
  552.     include    dosfile.r
  553.     include    parse.r
  554.  
  555.  
  556. ;------------------
  557.  
  558. ;--------------------------------------------------------------------
  559.  
  560.     base    rwc_oldbase
  561.  
  562. ;------------------
  563.  
  564.     ENDIF
  565.  
  566.     end
  567.  
  568.